package com.ljy.my_study.java.gc;

/**
 * @author lijunying
 * @date 2021/1/4 16:21
 */
public class LocalvarGc {

    /**
     * -XX:+PrintGCDetails
     * 这个配置可以在执行gc时查看gc日志
     * 新生代：Eden，from，to（from,to统称为Survisor Spaces 幸存区）
     */
    public static void main(String[] args) {
        LocalvarGc localvarGc=new LocalvarGc();
//        localvarGc.localvarGc3();
//        localvarGc.localvarGc4();
//        localvarGc.localvarGc5();
        localvarGc.localvarGc6();
    }

    /**
     * 槽位复用
     * b变量不能使用a的槽位
     */
    public void localvarGc(){
        int a=0;
        System.out.println(a);
        int b=0;
    }

    /**
     * b变量可以使用a的槽位
     */
    public void localvarGc2(){
        {
            int a=0;
            System.out.println(a);
        }
        int b=0;
    }

    /**
     * 大对象直接进入老年代
     * 当是6M的对象，对象依然存在于新生代，18M才属于大对象，存在于老年代。
     * 说明跟内存有关，新生代可以通过-Xmn来设置
     */
    public void localvarGc3(){
        byte[] a=new byte[18*1024*1024];
        System.gc();
    }

    /**
     * 进入老年代后，在{}代码块中的内容不能通过gc方法不能回收
     */
    public void localvarGc4(){
        {
            byte[] a=new byte[18*1024*1024];
        }
        System.gc();
    }

    /**
     * a的槽位被b占用，{}代码块中的内容被回收
     */
    public void localvarGc5(){
        {
            byte[] a=new byte[18*1024*1024];
        }
        int b=0;
        System.gc();
    }

    /**
     * localvarGc3中局部变量依然没有被回收释放，栈帧被销毁，byte数组失去引用，在外部通过gc方法才能回收掉
     */
    public void localvarGc6(){
        localvarGc3();
        System.gc();
    }
}
